//保护模式
//编译器默认32位
#include"loader.h"
//扇区，扇区数
static void read_disk(unit32_t sector,unit32_t sector_count,unit8_t*buffer)
{  //0x1F6寄存器
//具体是通过向端口 0x1F6 写入一个值来配置硬盘的 LBA（Logical Block Addressing）模式 和选择主盘或从盘
   // LBA模式LBA位总为1-->0x40    主盘，从盘
    outb(0x1F6,0X40|(0<<4));
    //扇区数量的高8字节
    outb(0x1F2,(unit8_t)(sector_count>>8));
    outb(0x1F3,(unit8_t)(sector>>24));//提取高8位
    outb(0x1F4,0x00);
    outb(0x1F5,0x00);

    outb(0x1F2,(unit8_t)sector_count);
    outb(0x1F3,(unit8_t)(sector));
    outb(0x1F4,(unit8_t)(sector>>8));
    outb(0x1F5,(unit8_t)(sector)>>16);


    outb(0x1F7,0x24);//读取
    unit16_t*data_buf=(unit16_t*)buffer;
    while(sector_count--)
    {
        while((inb(0x1F7)&0x88)!=0x8)//读错误位，不错正常
        {}
        //错误位处理不了？
        for(int i=0;i<SECTOR_SIZE/2;i++)//每次返回16位(磁盘数据寄存器16位，一个扇区512B
        {
            *data_buf++=inw(0x1F0);
        }
    }
}
void load_kernel(void){
    //kernel在100扇区（LBA模式从0开始），共500扇区，256kb,读到内存位置是第三个参数
    read_disk(100,500, (unit8_t*)SYS_KERNEL_LOAD_POS);
    ((void(*)(void))(unit32_t*)(SYS_KERNEL_LOAD_POS))();
    for(;;){}
}

